﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using AutomationTools.Procedimentos.Exceptions;

namespace AutomationTools.Procedimentos.Busca
{
    /// <summary>
    /// Executa uma Regex na string recebida pelo parametro.
    /// Recebe:     string - Contendo o texto a ser usado na Regex
    /// Retorna:    string[] - Contendo os resultados da Regex
    /// </summary>
    public class ExecutarRegex : IProcedimento
    {
        public Regex Regex { get; set; }

        /// <summary>
        /// Cria a regex com os parametros: RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Singleline
        /// </summary>
        /// <param name="regex">Regex a ser executada no texto recebido.</param>
        public ExecutarRegex(string regex)
            : this(new Regex(regex, RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Singleline))
        {

        }

        /// <summary>
        /// Executa uma Regex na string recebida pelo parametro.
        /// </summary>
        /// <param name="regex">Regex a ser executada no texto recebido.</param>
        /// <param name="groupIndex">Indice do grupo a ser utilizado na montagem do array (string) de retorno.</param>
        public ExecutarRegex(Regex regex, int groupIndex = 0)
        {
            Regex = regex;
        }


        public int GroupIndex { get; set; }


        public object Executar(IContexto contexto)
        {
            ValidarEntrada(contexto);

            List<string> ret = new List<string>();
            string corpo = ((string)contexto.Parametro);
            if (Regex != null)
            {
                foreach (Match item in Regex.Matches(corpo))
                {
                    ret.Add(item.Groups[GroupIndex].Value);
                }
            }

            return ret.ToArray();
        }

        public void ValidarEntrada(IContexto contexto)
        {
            if (!(contexto.Parametro is string))
            {
                throw new ParametroException(typeof(string), contexto.Parametro.GetType());
            }
        }
    }
}
